package com.lyrcsoft;

import com.lyrcsoft.config.AppConfig;
import org.springframework.beans.SimpleTypeConverter;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
		context.register(AppConfig.class);
		context.refresh();
		// ============================================================================
		// 可以直接把某个类转换为BeanDefinition，并且会解析该类上的注解，比如
		// AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(context);
		// reader.register(User.class);
		// System.out.println(context.getBean("user"));
		// ============================================================================
		// 扫描spring.xml配置 可以解析<bean/>标签
		// XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(context);
		// xmlBeanDefinitionReader.loadBeanDefinitions("spring.xml");
		// System.out.println(context.getBean("user"));
		// ============================================================================
		// 手动配置扫描 ClassPathBeanDefinitionScanner是扫描器，但是它的作用和BeanDefinitionReader类似，
		// 它可以进行扫描，扫描某个包路径，对扫描到的类进行解析，
		// 比如，扫描到的类上如果存在@Component注解，那么就会把这个类解析为一个BeanDefinition。
		// ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
		// scanner.scan("com.lyrcsoft");
		// System.out.println(context.getBean("userService"));

		// BeanDefinition 核心
		// 		-- GenericBeanDefinition
		//         -- AnnotatedGenericBeanDefinition ==> register
		// 		-- ScannedGenericBeanDefinition	   ==> scanner
		// 		-- RootBeanDefinition  ==> 合并BeanDefintion 属于Bean的生命周期里面的东西


		// 国际化
		// System.out.println(context.getMessage("name", null, Locale.ENGLISH));

		//资源加载
		// ry {
		// Resource resource1 = context.getResource("https://www.baidu.com");
		// System.out.println(resource1.contentLength());
		// System.out.println(resource1.getURL());
		// Resource resource2 = context.getResource("classpath:spring.xml");
		// System.out.println(resource2.contentLength());
		// System.out.println(resource2.getURL());
		// for (Resource resource : resources) {
		// 	System.out.println(resource.contentLength());
		// 	System.out.println(resource.getFilename());
		// }
		//  catch (IOException e) {
		// e.printStackTrace();
		//
		// 获取运行时环境
		// Map<String, Object> systemEnvironment = context.getEnvironment().getSystemEnvironment();
		// System.out.println("===getSystemEnvironment===");
		// System.out.println(systemEnvironment);

		// Map<String, Object> systemProperties = context.getEnvironment().getSystemProperties();
		// System.out.println("===getSystemProperties===");
		// System.out.println(systemProperties);

		// MutablePropertySources propertySources = context.getEnvironment().getPropertySources();
		// System.out.println("===getPropertySources===");
		// System.out.println(propertySources);

		// System.out.println("===getPropertySources===");
		// System.out.println(context.getEnvironment().getProperty("NO_PROXY"));
		// System.out.println(context.getEnvironment().getProperty("sun.jnu.encoding"));
		// System.out.println(context.getEnvironment().getProperty("customs"));

		// 事件发布
		// context.publishEvent("发布了一个事件");

		// 类型转化 PropertyEditor
		// StringToUserPropertyEditor propertyEditor = new StringToUserPropertyEditor();
		// propertyEditor.setValue("张三");
		// System.out.println(propertyEditor.getValue());
		// UserService userService = (UserService) context.getBean("userService");
		// userService.test();

		//  类型转化 ConversionService，直接使用，也可以通过Bean方式注入
		// DefaultConversionService conversionService = new DefaultConversionService();
		// conversionService.addConverter(new StringToUserConverter());
		// System.out.println(conversionService.convert("黑神", User.class));
		// UserService userService = (UserService) context.getBean("userService");
		// userService.test();

		// TypeConverter
		// 整合了PropertyEditor和ConversionService的功能，是Spring内部用的
		//SimpleTypeConverter typeConverter = new SimpleTypeConverter();
		//typeConverter.registerCustomEditor(User.class, new StringToUserPropertyEditor());
		////typeConverter.setConversionService(conversionService);
		//User value = typeConverter.convertIfNecessary("1", User.class);
		//System.out.println(value);
	}

}
